using System;
using System.Collections;
using System.Text;
using System.Data;
using System.Data.SqlClient;

using Admaco.Data;
using System.IO;

namespace Admaco.Data
{
    public abstract class AbstractDataClass
    {
        private Conexion conexion;

        /// <summary>
        /// Obtiene el DataTable correspondiente a la sentencia de seleccion pasada como parametro
        /// </summary>
        /// <param name="sSel">Sebntencia de seleccion SQL</param>
        /// <returns>DataTable resultante</returns>
        public DataTable getDataTable(String sSel)
        {
            DataTable dt = new DataTable();

            try
            {
                // Obtengo una conexion a la base de datos
                conexion = Conexion.getInstance();
                SqlConnection conn = conexion.getConnection();

                String sCnn = conexion.getConnectionString();

                SqlDataAdapter da = new SqlDataAdapter(sSel, sCnn);
                SqlCommandBuilder cb = new SqlCommandBuilder(da);
                da.MissingSchemaAction = MissingSchemaAction.AddWithKey;

                da.Fill(dt);
                return dt;

            }
            catch (Exception e)
            {
                throw new DataAccessException("Error en el acceso a la base de datos " + e);
            }
            finally
            {
                if (conexion != null)
                    conexion.cerrarConexion();
            }
        }

        /// <summary>
        /// Obtiene el DataTable correspondiente a la sentencia de seleccion pasada como parametro
        /// </summary>
        /// <param name="sSel">Sebntencia de seleccion SQL</param>
        /// <returns>DataTable resultante</returns>
        public DataTable getDataTable(String sSel, ArrayList paramCollection)
        {
            DataTable dt = new DataTable();

            try
            {
                // Obtengo una conexion a la base de datos
                conexion = Conexion.getInstance();
                SqlConnection conn = conexion.getConnection();
                
                String sCnn = conexion.getConnectionString();

                SqlDataAdapter da = new SqlDataAdapter(sSel, sCnn);
                foreach (SqlParameter param in paramCollection)
                {
                    da.SelectCommand.Parameters.Add(param);
                }
                da.MissingSchemaAction = MissingSchemaAction.AddWithKey;                
                
                da.Fill(dt);
                return dt;

            }
            catch (Exception e)
            {
                throw new DataAccessException("Error en el acceso a la base de datos " + e);                                                
            }
            finally
            {
                if (conexion != null)
                    conexion.cerrarConexion();
            }
        }

        /// <summary>
        /// Obtiene el SqlDataAdapter correspondiente a la sentencia de seleccion pasada como parametro
        /// </summary>
        /// <param name="sSel">Sentencia de seleccion SQL</param>
        /// <returns>SqlDataAdapter resultante</returns>
        public SqlDataAdapter getSqlDataAdapter(String sSel)
        {

            try
            {
                // Obtengo una conexion a la base de datos
                conexion = Conexion.getInstance();
                SqlConnection conn = conexion.getConnection();

                String sCnn = conexion.getConnectionString();

                SqlDataAdapter da = new SqlDataAdapter(sSel, sCnn);

                return da;

            }
            catch (Exception e)
            {
                throw new DataAccessException("Error en el acceso a la base de datos " + e);
            }
            finally
            {
                if (conexion != null)
                    conexion.cerrarConexion();
            }
        }


        /// <summary>
        /// Carga los campos del objeto que corresponden con la tupla pasado como parametro
        /// </summary>
        /// <param name="id">Identificador de la tupla</param>
        abstract public void get(int id);

        /// <summary>
        /// Retorna una Array con todas las filas existentes en la tabla
        /// </summary>
        /// <returns></returns>
        abstract public ArrayList getAll();

        /// <summary>
        /// Almacena el objeto en la base de datos
        /// </summary>
        /// <param name="id">Identificador de la tupla</param>
        abstract public void save();

        /// <summary>
        /// Elimina el objeto de la base de datos
        /// </summary>        
        abstract public void delete();
    }
}
